The #include Directive

Contents|Index|Previous|Next
The `#include` directive

Both user and system header files are included using the preprocessing directive, #include. It has the following three variants.

- #include<file>

This variant is used for system header files. It searches for a file named file in a list of directories specified by you, then in a standard list of system directories. You specify directories to search for header files with the command option, -I (see Invoking the C preprocessor). The option, -nostdinc, inhibits searching the standard system directories; in this case only the directories you specify are searched.
The parsing of this form of #include is slightly special because comments are not recognized within the <...>. Thus, in #include <x/*y>, the /* does not start a comment and the directive specifies inclusion of a system header file named x/*y. Of course, a header file with such a name is unlikely to exist on Unix, where shell wildcard features would make it hard to manipulate.
The argument, `file`, may not contain a > character. It may, however, contain a < character.

- #include "file"

This variant is used for header files of your own program. It searches for a file named file first in the current directory, then in the same directories used for system header files. The current directory is the directory of the current input file. It is tried first because it is presumed to be the location of the files that the current input file refers to. (If the -I- option is used, the special treatment of the current directory is inhibited.)
The argument, file, may not contain ‘"’ characters. If backslashes occur within `file`, they are considered ordinary text characters, not escape characters. None of the character escape sequences appropriate to string constants in C are processed. Thus, #include "x\n\\y" specifies a filename containing three backslashes. It is not clear why this behavior is ever useful, but the ANSI standard specifies it.

- #include anything else

This variant is called a computed #include. Any #include directive whose argument does not fit the above two forms is a computed include. The text, `anything else`, is checked for macro calls, which are expanded (see Macros). When this is done, the result must fit one of the previous two variants—in particular, the expanded text must, in the end, be surrounded by either quotes or angle braces.
This feature allows you to define a macro which controls the file name to be used at a later point in the program. One application of this is to allow a site-specific configuration file for your program to specify the names of the system include files to be used. This can help in porting the program to various operating systems in which the necessary system header files are found in different places.

Top|Contents|Index|Previous|Next